package com.xac.common.util.io;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PushbackInputStream;

/**
 * @author frank
 *
 */
public class StreamUtil {

	private static final String LINE_SEPARATOR = System.getProperty("line.separator");

	/**
	 * @param is
	 * @return
	 */
	public static byte[] readStream(InputStream is) throws IOException {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = -1;
		while ((len = is.read(buffer)) != -1) {
			out.write(buffer, 0, len);
		}
		out.flush();

		if (out != null)
			out.close();
		if (is != null)
			is.close();

		return out.toByteArray();
	}

	/**
	 * @param is
	 * @return
	 */
	public static String readStreamAsString(InputStream is) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		StringBuilder sb = new StringBuilder();

		String line = null;
		while ((line = reader.readLine()) != null) {
			sb.append(line + LINE_SEPARATOR);
		}
		if (is != null)
			is.close();

		return sb.toString();
	}

	/**
	 * @param file
	 * @param data
	 * @throws Exception
	 */
	public static void save(File file, byte[] data) throws Exception {
		FileOutputStream outStream = new FileOutputStream(file);
		outStream.write(data);
		outStream.close();
	}

	/**
	 * @param in
	 * @return
	 * @throws IOException
	 */
	public static String readLine(PushbackInputStream in) throws IOException {
		char buf[] = new char[128];
		int room = buf.length;
		int offset = 0;
		int c;

		loop: while (true) {
			switch (c = in.read()) {
			case -1:
			case '\n':
				break loop;
			case '\r':
				int c2 = in.read();
				if ((c2 != '\n') && (c2 != -1))
					in.unread(c2);
				break loop;
			default:
				if (--room < 0) {
					char[] lineBuffer = buf;
					buf = new char[offset + 128];
					room = buf.length - offset - 1;
					System.arraycopy(lineBuffer, 0, buf, 0, offset);

				}
				buf[offset++] = (char) c;
				break;
			}
		}

		if ((c == -1) && (offset == 0))
			return null;

		return String.copyValueOf(buf, 0, offset);
	}
}
